# 1、 break定义计数器
# 案例：一共吃5个苹果，吃完第一个，吃第二个…，这里“吃苹果”是重复动作
# 情况一：如果吃的过程中，吃完第三个吃饱了，则不需要再吃第4个和第五个苹果，
# 即是吃苹果的动作停止（不再吃苹果）
# num = 1
# while num <= 5:
#     print(f"吃第{num}个苹果")
#     if num == 3:
#         print("放坏了不能吃了！")
#         break  #跳出整个循环，当满足循环体里的某个条件时提前结束循环
#     num += 1

# # 外层循环控制行数（1到9行）
# for i in range(1, 10):
#     # 内层循环控制每行的列数（第i行有i列）
#     for j in range(1, i + 1):
#         # 打印乘法表达式，end="\t" 表示用制表符分隔，不换行
#         print(f"{j}×{i}={j*i}", end="\t")
#     # 每行打印完后换行
#     print()


# # 输入小明同学的年龄
# name = "小明"
# age = int (input ("请输入年龄：")) # 输入任意数都会当做字符串处理 "123"
# print (f"{name} 同学的年龄是：{age}")
# print (f"{name} 同学明年的年龄是：{age + 1}")



# # 定义变量  字符串的定义
# info1 = "D:\tools\noco"  #\t制表符  \n换行
# info2 = r"D:\tools\noco"
# info3 = "D:\\tools\\noco"
# info4 = '张三说："你很厉害"'
# info5 = "张三说：'你很厉害'"
# # print(info1)
# # print(info2)
# # print(info3)
# print(info4)
# # print(info5)


# # 1.通过位置（下标）找元素 字符元素查找
# # 定义变量
# info = "abcdefg"
# # 获取字母d
# print(info[3])    #下标从0开始 d
# # print(info[‐4])   #倒着数从1开始 d
# # 2.通过元素找位置（下标）
# # 字母e在哪个位置？
# print(info.find("e"))
# # 字母k在哪个位置？
# print(info.find("k")) # 如果找不到返回‐1



# # 字符串替换
# info = "金三胖同志被称之为世界最成功的80后，金三胖真牛！"
# # 使用字符串（替换）
# info1 = info.replace("金三胖","马赛克")
# print(info1)
# print(info)
# # 结论：
# # 字符串不可变数据类型，进行替换操作之后，原有的字符串不发生变化


# # 字符串连接
# #定义变量
# info = ['Python', 'Java', 'PHP']
# num = [11, 22, 33]  #整型整数，不是字符元素
# # 连接
# info1 = " and ".join(info)
# print(info1)
# print(type(info1))
# # print("‐".join(num)) # 序列中如果不是字符元素，报错
# # 结论：
# # 通过连接字符将列表/元组/集合对应字符元素才能连接成字符串


# # 字符串拆分
# # 定义SQL语句变量
# sql = "SelECt * from students where id = 001;"
# # 上述SQL语句按照空格把语句中的单词拆分出来
# print(sql.split()) # 结果类型是列表 不输入分隔符，默认按照空格拆分
# # 在上述基础上把每个单词打印出来？
# for i in sql.split():  # 对应容器中元素的获取直接使用for循环即可
#     print(i)
#
# str =[1,2,3,4,5]
# for i in str:
#     print(i)
# # print(str)
# # 上述SQL按照where拆分出来
# # print(sql.split("where")) # 括号里面的字符叫分隔符
# # 总结
# # 1.通过split拆分后，结果是列表类型

# # 字符串中字母大小写转换
# # 转大写： 字符串.upper()
# s = "hello world"
# print(s.upper())  # 输出：HELLO WORLD
# # 转小写： 字符串.lower()
# s = "HELLO WORLD"
# print(s.lower())  # 输出：hello world
# # 判断是字母： 字符串.isalpha()
# s1 = "a"
# print(s1.isalpha())  # 输出：True
# s2 = "1"
# print(s2.isalpha())  # 输出：False
# # 判断是数字： 字符串.isdigit()
# s3 = "123"
# print(s3.isdigit())  # 输出：True
# s4 = "abc"
# print(s4.isdigit())  # 输出：False
# # 判断某个字符出现的次数： 字符串.count("字符")
# s = "hello python, hello world"
# print(s.count("hello"))  # 统计"hello"出现的次数，输出：2
# print(s.count("l"))      # 统计"l"出现的次数，输出：5
# # 字符串两头去除空格变量.strip()
# s = "  hello python  "
# print(s.strip())  # 输出：hello python


# # 列表的定义
# # 定义空列表
# info = []
# info1 = list()
# print(info)
# print(info1)
# # 定义非空列表
# info2 = [11, "aaa", 1.88]
# print(info2)

# # 列表元素查询：索引
# name_list = ['张三', '李四', '王五']
# # 按照索引查元素
# # 查询李四
# print(name_list[0]) # 张三
# print(name_list[1]) # 李四
# # 查询不存在的索引
# print(name_list[4])
# # 总结：如果查询的下标（索引）不存在，则代码报错【索引超出了范围】
# # 根据元素查索引
# print(name_list.index("王五")) # 下标是2

# # 列表元素统计：元素统计
# # 定义列表
# data_list = ['python', 'java', 'python', 'php']
# # 统计java出现次数
# print(data_list.count("python")) # 次数：1
# print(data_list.count("C++")) # 次数：0
# # 结论：
# # 统计列表元素出现的次数
# # 元素不存在统计结果为0

# # 列表元素增加：末尾增加元素
# # 定义列表
# val_list = ["Web自动化", "UI自动化", "接口自动化"]
# # 添加元素（末尾添加：APP自动化）
# val_list.append("APP自动化")
# # 查看原来列表
# print(val_list)
# # 增加数字元素
# val_list.append(11)
# print(val_list)
# # 结论：
# # 列表属于可变数据类型，增加元素后，原有的列表的值会发生变化
# # 追加元素每次只能追加1个，而且每次追加的位置在列表的末尾

#
# # 列表元素增加：指定位置增加元素
# # 定义列表
# val_list = ["Web自动化", "UI自动化", "接口自动化"]
# # 添加元素到第二个位置（APP自动化）
# val_list.insert(1,"APP自动化")
# # 查看原有列表
# print(val_list) # ['Web自动化', 'APP自动化', 'UI自动化', '接口自动化']
# # 在上述列表的第7个位置添加元素“java”
# val_list.insert(6,"java")
# print(val_list) # ['Web自动化', 'APP自动化', 'UI自动化', '接口自动化', 'java']
# # 结论：
# # 指定的位置如果存在，按照指定位置插入元素；如果不存在，默认添加到列表的末尾


# # 列表的合并
# # 定义列表
# info1 = [1,2,3]
# info2 = [4,5,6]
# # 合并
# info2.extend(info1)
# # 查看原来列表1
# print(info2) # [4,5,6,1,2,3]
# print(info1) # [1,2,3]
#
# # 列表元素删除：指定索引位置删除
# # 定义列表
# val_list = ['Web自动化', 'APP自动化', 'UI自动化', '接口自动化', 'java']
# # 删除下标为2对应元素
# val_list.pop(2)
# # 查看原有列表
# print(val_list)
# # 下标为空删除
# val_list.pop()
# print(val_list)
# # 删除下标为7的元素
# # val_list.pop(7) # IndexError: pop index out of range
# # print(val_list)
# # 结论：
# # 1.下标存在直接按照指定下标删除;如果下标不存在，直接报错
# # 2.如果下标不写，默认删除最后一个元素

# # 列表元素删除：指定数据删除
# # 定义列表
# val_list = ['Web自动化', 'APP自动化', 'java', 'UI自动化', '接口自动化', 'java']
# # 删除：“APP自动化”
# val_list.remove('APP自动化')
# # 查看原有列表
# print(val_list)    # ['Web自动化', 'java', 'UI自动化', '接口自动化', 'java']
# # 删除：java
# val_list.remove('java')
# print(val_list) # ['Web自动化', 'UI自动化', '接口自动化', 'java']
# # 删除：python
# # val_list.remove("python") # 报错：ValueError: list.remove(x): x not in list
# # 总结：
# # 1. 如果元素存在直接删除，如果存在多个元素默认删除第一个匹配到的
# # 2. 如果元素不不存在直接删除，报错

# # 使用while 循环来删除列表中所有的 'java' 元素
# # 定义列表
# val_list = ['Web自动化', 'APP自动化', 'java', 'UI自动化', '接口自动化', 'java']
# while 'java' in val_list:
#     val_list.remove('java')
# print(val_list)


# # 列表元素修改：修改指定索引的数据
# # 定义列表
# val_list = ["Web自动化", "UI自动化", "接口自动化", "APP自动化"]
# # 把UI自动化修改为性能自动化
# val_list[1] = "性能自动化"
# # 查看原有列表
# print(val_list)
# # 指定下标为5的数据修改为：python
# # val_list[5] = "python" # IndexError: list assignment index out of range
# # 结论
# # 1.下标存在直接修改对应位置的元素；下标不存在直接报错

# # 列表元素反转：元素倒置（反转）
# # 定义列表
# info = [8, 100, 30, 10, 40, 2]
# # 反转
# info.reverse()
# # 查看原有列表
# print(info) # [2, 40, 10, 30, 100, 8]


# # 列表元素排序：大小排列
# # 定义列表
# info = [8, 100, 30, 10, 40, 2]
# # 从小到大排序
# info.sort()
# # info.sort(reverse=False)  这行可写可不写，reverse=False表示升序（默认可以不写）
# # 查看原有列表
# print(info)
# # 从大到小排序
# info.sort(reverse=True)
# print(info)
# # 结论：
# # 1.sort内部有常见两个参数，key:表示按照哪个指标排序（key的值必须是一个函数），reverse:表示排序规则（升序/降序）
# # 2.reverse=False表示升序（默认可以不写）；如果reverse=True表示降序

# # 列表的嵌套元素获取：列表中的元素还是列表
# # 定义列表
# # 列表中的元素还是列表：列表嵌套
# student_list = [["张三", "18", "功能测试"], ["李四", "20", "自动化测试"], ["王五", "22",["python", "java"]]]
# # 获取指定的元素
# # 查找元素18，如何查找？
# print(student_list[0])
# aa = student_list[0] # ['张三', '18', '功能测试']
# print(aa[1]) # 18
# # 合并起来
# print(student_list[0][1]) # 18
# # 查找李四
# print(student_list[1][0]) # 李四
# # 查找java
# print(student_list[2][2][1]) # java

#
# # 嵌套应用案例2
# # 定义非空列表(把每种测试结果的数据放在一起)
# login_data = [
#     ["13488888888", "123456", "8888"],
#     ["13488888888", "666666", "8888"],
#     ["13488888880", "123456", "8888"],
#     ["13488888888", "123456", "0000"]
# ]
# # 遍历
# for i in login_data:
#     # print(i) # 每一个中括号的数据 ，i = ["13488888888", "123456", "8888"]
#     #判断手机号和密码
#     if i[0] == "13488888888" and i[1] == "123456":
#         # 判断验证码
#         if i[2] == "8888":
#             print("登录成功")
#         else:
#             print("验证码错误")
#     else:
#        print("用户名或密码错误")


# # 元组的定义
# # 定义空元组
# info = ()
# info1 = tuple()
# print(info)
# print(info1)
# # 非空
# info2 = (11, 22, 33, 44)
# print(info2)
# # 单个元素
# # info3 = ("55") # 不加逗号此时为：<class 'str'>
# info3 = ("55",)
# print(type(info3)) # <class 'tuple'>
# # 不写括号
# info4 = 1, 2, 3, 4
# print(type(info4)) # <class 'tuple'>
# # 结论：
# # 1. 元组的括号可以省略
# # 2. 元组是一个元素值时，需要在元素后面加逗号

# # 元组元素查询：索引
# # 定义元组
# info = (11, "aaa", 1.88)
# # 查看下标为2对应元素
# print(info[2]) # 1.88
# # 查看下标为4对应元素
# # print(info[4]) # IndexError: tuple index out of range
# # 总结：
# # 1.如果下标存在，直接查询对应位置的元素；下标不存在直接报错

# # 元组元素查询：元素统计
# # 定义元组
# info = (1, 2, 3, 2)
# # 统计元素2出现的次数
# print(info.count(2)) # 出现2次
# print(info.count(3)) # 出现1次
# print(info.count(4)) # 出现0次

# # 元组其他应用：数据交换
# # 定义变量
# num1 = 100
# num2 = 200
# # 交换两个数据
# # 方式1：找第三个变量，进行互换
# tmp = num1
# num1 = num2
# num2 = tmp
# print("此时num1的值：", num1)
# print("此时num2的值：", num2)
# # 方式2：直接借助于python元组类型的数据直接替换
# # aa = 200 # 相当于把200给aa
# # bb = 100 # 相当于把100给bb
# # num1 = aa
# # num2 = bb
# # 合并结果 # num1, num2 = 200, 100
# # num1, num2 = num2, num1 # 元组元素的外层小括号可以省略
# # print("此时num1的值：", num1)
# # print("此时num2的值：", num2)

# # 集合的定义
# # 1.定义空集合
# info = set()
# print(info)
# # 2.集合中添加元素："a"
# info.add("a")
# info.add("b")
# print(info)
# # 定义非空字符串
# var = "abcdeabdcdf"
# # 3.打印非重复的元素
# print(set(var)) # 转换为集合去重 # {'c', 'f', 'e', 'a', 'b', 'd'}
# tmp = list(set(var)) # 再转换为列表
# tmp.sort() # 再进行排序
# print(tmp) # ['a', 'b', 'c', 'd', 'e', 'f']
# print("".join(tmp)) # 还原成字符串：abcdef

# # 切片操作
# # 作用：按照指定要求获取一段数据
# # 定义非空字符串
# name = "abcdefgh"
# # 获取cde
# print(name[2:5])
# # print(name[2:5:1])
# # print(name[‐6:‐3])
# # print(name[‐6:‐3:1])
# # 获取defgh的字符
# # print(name[3:8])
# # print(name[3:]) # 结束下标不写，默认从开始下标到结尾
# # print(name[‐5:])
# # 获取abc的字符
# # 获取ace的字符
# # print(name[0:5:2]) # 取出0 、2 、4下标对应元素
# # print(name[:5:2]) # 开始下标不写，默认从第一个元素开始
# # # 获取hgfedcba
# # print(name[::‐1])

# # 序列长度
# # 定义非空字符串
# info = "abcdefgh"
# info1 = "Hello Python"
# # 统计字符元素个数（长度）
# print(len(info)) # 8
# print(len(info1)) # 12
# # 定义非空列表
# info2 = [11, "aa", 1.88, (1, 2, 3), ["aa", "bb"]]
# print(len(info2)) # 5
# # 定义非空元组
# info3 = (11, "aa", 1.88)
# print(len(info3)) # 3
# # 定义非空字典
# info4 = {"name": "tom", "age": 18, "gender": "男"}
# print(len(info4)) # 3
# # 结论：
# # 1.字典元素统计按照键值对统计


# # 清空序列
# info2 = [11, "aa", 1.88, (1, 2, 3), ["aa", "bb"]]
# # 清空列表数据
# info2.clear()
# # 查看原有列表
# print(info2)
# info4 = {"name": "tom", "age": 18, "gender": "男"}
# # 清空字典数据
# info4.clear()
# # 查看原有字典
# print(info4)
# # 结论：只针对可变数据类型可以做清空










